package com.millstein.tsinglog.service;

import com.millstein.tsinglog.model.dto.article.ArticleSaveDTO;
import com.millstein.tsinglog.model.pojo.Article;
import com.millstein.tsinglog.model.vo.biz.ArticleVo;
import com.millstein.tsinglog.model.vo.result.PageDetail;
import com.millstein.tsinglog.model.vo.result.PageResult;

import java.util.List;
import java.util.Map;

public interface ArticleService {

    /**
     * 分页查询所有文章
     * @param currentPage 当前页
     * @param pageSize 每页显示多少条数据
     * @param keyword 搜索关键字
     * @param cid 按分类搜索
     * @return
     */
    PageResult<ArticleVo> getArticleByPage(Integer currentPage, Integer pageSize, String keyword, Long cid);

    /**
     * 修改文章的展示状态
     * @param id 文章id
     * @param isRelease 是否发布
     * @param canComment 是否允许评论
     * @param upToTop 是否置顶
     */
    void changeArticleStatus(Long id, Short isRelease, Short canComment, Short upToTop);

    /**
     * 批量修改文章的展示状态
     * @param ids 文章集合
     * @param isRelease 是否发布
     * @param canComment 是否允许评论
     * @param upToTop 是否置顶
     * @return
     */
    void changeMultiArticleStatus(List<Long> ids, Short isRelease, Short canComment, Short upToTop);

    /**
     * 保存文章
     * @param articleSaveDTO 需要保存的文章的信息
     */
    void insertArticle(ArticleSaveDTO articleSaveDTO);

    /**
     * 根据id获取文章信息
     * @param id 文章id
     * @return
     */
    ArticleVo getArticleById(Long id);

    /**
     * 修改文章
     * @param articleSaveDTO 需要修改的文章的信息
     */
    void updateArticle(ArticleSaveDTO articleSaveDTO);

    /**
     * 根据文章id的集合删除对应的文章
     * @param ids 保存文章id的集合
     */
    void deleteByIds(List<Long> ids);

    /**
     * 在轮播图新增的模态框中查询里面列表需要的展示的数据，这里的展示的文章需要满足两个条件
     *      1.文章已经启用
     *      2.文章还未增加到轮播图中
     * @param currentPage 当前页
     * @param keyword 搜索关键字
     * @return
     */
    PageResult<ArticleVo> getArticleDataForSave(Integer currentPage, String keyword);

    /**
     * 给门户的首页准备文章的数据
     * @param currentPage 当前页
     * @param pageSize 每页数据量
     * @param type 类型 1为查询最近发表的文章，2位查询最近评论的文章
     * @return
     */
    PageResult<ArticleVo> getArticleForLatest(Integer currentPage, Integer pageSize, Short type);

    /**
     * 给门户的首页准备热门文章的数据
     * @return
     */
    List<Map<String, Object>> getHotArticle();

    /**
     * 为文章列表页提供文章列表数据
     * @param currentPage 当前页
     * @param pageSize 每页数据量
     * @param cid 分类id
     * @param tid 标签id
     * @param keyword 关键字
     * @return
     */
    PageDetail<ArticleVo> getArticleForSearch(Integer currentPage, Integer pageSize, Long cid, Long tid,
                                              String keyword);

    /**
     * 为文章详情页提供文章内容信息
     * @param id
     * @return
     */
    ArticleVo getArticleDetailForPortal(Long id);

    /**
     * 根据位置查找相应文章的信息
     * @param id 本文章的id
     * @param position 位置，正数表示向后面查找，负数表示向前面查找
     * @return
     */
    Map<String, Object> getArticleByPosition(Long id, int position);

    /**
     * 给文章点赞
     * @param id 文章id
     * @return 点赞后本文章的点赞数字
     */
    Integer preferThisArticle(Long id);
}
